
#ifndef _ST_GRAPHIC_H_
#define _ST_GRAPHIC_H_

#define ST_GRAPHIC_COLORKEY_R     0x86
#define ST_GRAPHIC_COLORKEY_G     0x10
#define ST_GRAPHIC_COLORKEY_B     0x07

#define ST_GRAPHIC_COLORKEY_24BIT 0x861007

/*******************************************************************************
 *          单个图片相关{{{1
 ******************************************************************************/
struct _st_graphic
{
    void*        owner;
    SDL_Surface* image;
    st_state     (*LoadImageFromFile)(struct _st_graphic* self, const st_uint8* filename);

    /* with refcount mechanism */
    st_state     (*Assign)(struct _st_graphic* self, const struct _st_graphic* src);
    void         (*Free)(struct _st_graphic* self);

    /* 图片的设备空间坐标。关于设备空间，见NOTE */
    st_vertex_3d pos;
    st_vertex_3d offset;
    void         (*SetPos)(struct _st_graphic* self, const st_vertex_3d* pos);
    void         (*GetPos)(struct _st_graphic* self, st_vertex_3d* pos);
    void         (*SetOffset)(struct _st_graphic* self, const st_vertex_3d* offset);
    void         (*GetOffset)(struct _st_graphic* self, st_vertex_3d* offset);

    /* call backs */
    void         (*Draw)(struct _st_graphic* self);
    void         (*on_drawing)(void* arg);
};
typedef struct _st_graphic st_graphic;

st_graphic* st_graphic_CreateGraph(const void* owner,
                                   void  (*on_drawing)(void* arg),
                                   const st_vertex_3d* pos,
                                   const st_vertex_3d* offset);
/*******************************************************************************
 *          单个图片相关 END}}}1
 ******************************************************************************/

/*******************************************************************************
 *         主表面相关
 *         {{{1
 ******************************************************************************/
struct _st_graphic_screen
{
    SDL_Surface*    surface;
    /* BEWARE : ONLY ONE instance of st_graphic_screen is allowed, which resides in st-graphic */
    void            (*Free)(void);
    void            (*Update)(st_graphic** graphics, st_uint32 num);
    st_state        (*Copy)(SDL_Surface** surface);
};
typedef struct _st_graphic_screen st_graphic_screen;

/* 初始化主表面（并初始化SDL_Event） */
st_graphic_screen* st_graphic_InitScreen(st_uint32 width, st_uint32 height, st_uint32 bpp);
/*******************************************************************************
 *         }}}1
 *         主表面相关 END
 ******************************************************************************/

/*******************************************************************************
 *          系列图片{{{1
 * 系列图片用来保存一组动画图片，并且在合适的时候自动切换图片形成动画效果。
 * 系列中的图片不得超过8张。如果动画效果超过8张，可以创建多个st_graphic_series
 * 串在一起
 * it can keep a series of st_graphic. All graphics in a series has some common
 * properties, such as pos, owner. it is very useful to compose an animation.
 ******************************************************************************/
#define ST_GRAPHIC_SERIES_SIZE 16
struct _st_graphic_series{
    void*        owner;

    /* 在设备空间上的位置 */
    st_vertex_3d pos;
    void        (*SetPos)(struct _st_graphic_series* self, const st_vertex_3d* pos);

    /* 内部保存的系列图片 */
    st_graphic*  graphics[ST_GRAPHIC_SERIES_SIZE];
    st_uint8     count;
    st_uint8     current;
    st_state     (*Add)(struct _st_graphic_series* self, st_graphic* graphic);
    void         (*Clear)(struct _st_graphic_series* self);

    ///* 链式结构 */
    //struct _st_graphic_series next;
    //st_boolean   chained;
    //st_boolean   chain_head;
    //st_state     (*Chain)(struct _st_graphic_series* self, struct _st_graphic_series next);
    
    /* 始终指向当前图片 */
    st_graphic*  graphic;

    /* 可以挂到定时器上 */
    st_graphic*  (*Update)(struct _st_graphic_series* self);
    st_uint32    dt;

    /* 释放资源 */
    st_boolean  (*Free)(struct _st_graphic_series* self);
};
typedef struct _st_graphic_series st_graphic_series;

st_graphic_series*    st_graphic_series_Create(const st_vertex_3d* pos, const st_uint32 dt);
/*******************************************************************************
 *         系列图片 END}}}1
 ******************************************************************************/

/*******************************************************************************
 *          图片管理器{{{1
 ******************************************************************************/
struct _st_graphic_manager{
    st_graphic* graphic;

    /* 释放资源 */
    st_boolean  (*Free)(struct _st_graphic_series* self);
};
typedef struct _st_graphic_manager st_graphic_manager;

st_graphic_manager*    st_graphic_manager_Create(void);
/*******************************************************************************
 *         系列图片 END}}}1
 ******************************************************************************/
#endif

